package com.css.sword.knowing.search;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.css.sword.knowing.search.comm.SearchConst;

/**
 * 搜索的输入 indexName:索引名，字符串类型 type:索引类型，字符串类型
 * from，size设置把符合查询条件的那部分数据返回，查询结果类似数据库中的结果集，从0开始计数
 * SystemID：每个需要创建索引的系统，都会分配一个唯一的系统标识。 searchFields：搜索条件，每一项作为一个搜索条件。
 * returnFields：返回那些字段 以上属性，除returnFields外，都为必填项，如果不填returnFields，返回所有字段。
 */
/**
 * @author chxch
 *
 */
public class SearchInput {
	private String indexName;
	private String[] typeNames;
	private String[] routings;

	private int from = 0;
	private int size = 10;
	private boolean useSystemID = false;
	private String systemID;
	private String searchOperator = SearchConst.SEARCH_OPERATOR_MUST;
	private String preference = SearchConst.SEARCH_PREFERENCE_PRIMARY_FIRST;
	
	private String[] returnFields;
	private Map<String, Boolean> returnFieldsMap = new HashMap<String, Boolean>();

	private SearchField[] searchFields;

	private OrderField[] orderFields;

	private HighLightField[] highLightFields;

	/**
	 * 获取索引名称
	 * 
	 * @return 索引名称
	 */
	public String getIndexName() {
		return indexName;
	}

	/**
	 * 设置索引名称
	 * 
	 * @param indexName
	 *            索引名称
	 */
	public void setIndexName(String indexName) {
		this.indexName = indexName;
	}

	/**
	 * 获取索引类型
	 * 
	 * @return 索引类型数组
	 */
	public String[] getTypeNames() {
		return typeNames;
	}

	/**
	 * 设置索引类型
	 * 
	 * @param typeNames
	 *            索引类型数组
	 */
	public void setTypeNames(String[] typeNames) {
		this.typeNames = typeNames;
	}

	/**
	 * 获取routing值
	 * 
	 * @return routing值的字符串数组
	 */
	public String[] getRoutings() {
		return routings;
	}

	/**
	 * 设置routing（路由）值
	 * 
	 * @param routings
	 *            routing值的字符串数组。
	 */
	public void setRoutings(String[] routings) {
		this.routings = routings;
	}

	/**
	 * 获取分页起始值
	 * 
	 * @return 分页的起始值
	 */
	public int getFrom() {
		return from;
	}

	/**
	 * 设置分页起始值
	 * 
	 * @param from
	 *            分页的起始值
	 */
	public void setFrom(int from) {
		this.from = from;
	}

	/**
	 * 返回单页的文档数目
	 * 
	 * @return 文档数目
	 */
	public int getSize() {
		return size;
	}

	/**
	 * 设置单页的文档数目
	 * 
	 * @param size
	 *            返回单页的文档数目
	 */
	public void setSize(int size) {
		this.size = size;
	}

	public boolean isUseSystemID() {
		return useSystemID;
	}

	public void setUseSystemID(boolean useSystemID) {
		this.useSystemID = useSystemID;
	}

	/**
	 * 获取当前系统标识字段值
	 * 
	 * @return 标识字段值
	 */
	public String getSystemID() {
		return systemID;
	}

	/**
	 * 设置当前系统标识字段值
	 * 
	 * @param systemID
	 *            标识字段值，默认为：SearchConst.PUBLIC_PRIV
	 */
	public void setSystemID(String systemID) {
		this.systemID = systemID;
	}

	/**
	 * 获取搜索项间关系
	 * 
	 * @return 搜索项间关系常量
	 */
	public String getSearchOperator() {
		return searchOperator;
	}

	/**
	 * 设置搜索项间关系，取值为：SearchConst中的常量SEARCH_OPERATOR_MUST，
	 * SEARCH_OPERATOR_SHOULD和SEARCH_OPERATOR_MUST_NOT
	 * 
	 * @param searchOperator
	 *            搜索项间关系 默认值为：SEARCH_OPERATOR_MUST
	 */
	public void setSearchOperator(String searchOperator) {
		this.searchOperator = searchOperator;
	}

	/**
	 * 获取Preference值
	 * 
	 * @return preference值
	 */
	public String getPreference() {
		return preference;
	}

	/**
	 * 设置preference，取值为：SearchConst中SEARCH_PREFERENCE_开头的常量.
	 * 部分需要在常量的基础上在增加值，如：SearchConst.SEARCH_PREFERENCE_SHARDS+"2,3"
	 * 
	 * @param preference
	 *            搜索项间关系 默认值为：SEARCH_PREFERENCE_PRIMARY_FIRST
	 */
	public void setPreference(String preference) {
		this.preference = preference;
	}

	/**
	 * 获取返回字段名称
	 * 
	 * @return 待返回字段名称的字符串数组
	 */
	public String[] getReturnFields() {
		return returnFields;
	}

	/**
	 * 设置待返回字段名称
	 * 
	 * @param returnFields
	 *            待返回字段名称的字符串数组
	 */
	public void setReturnFields(String[] returnFields) {
		this.returnFields = returnFields;
		returnFieldsMap.clear();
		for(int i=0; i<returnFields.length; i++)
		{
		    returnFieldsMap.put(returnFields[i], false);
		}
	}

	/**
	 * 获取返回字段名称
	 * 
	 * @return 待返回字段名称的 List
	 */
	public List<String> getReturnFieldsAsList() {
		return Arrays.asList(returnFields);
	}

	/**
	 * 设置待返回字段名称
	 * 
	 * @param returnFields
	 *            待返回字段名称的List
	 */
	public void setReturnFields(List<String> returnFields) {
		this.returnFields = returnFields.toArray(new String[0]);
        returnFieldsMap.clear();
        for(int i=0; i<returnFields.size(); i++)
        {
            returnFieldsMap.put(returnFields.get(i), false);
        }
	}

	/**
	 * 获取返回字段名称
	 * 
	 * @return 待返回字段名称的 HashMap
	 */
	public Map<String, Boolean> getReturnFieldsAsHash() {
		return returnFieldsMap;
	}

	/**
	 * 设置待返回字段名称
	 * 
	 * @param returnFields
	 *            待返回字段名称的HashMap<String, Boolean> key:字段名称，value:字段是否多值，true多值,
	 *            false单值
	 */
	public void setReturnFields(Map<String, Boolean> returnFields) {
		this.returnFieldsMap = returnFields;
		this.returnFields = returnFields.keySet().toArray(new String[0]);
	}

	/**
	 * 获取搜索字段
	 * 
	 * @return SearchField数组
	 */
	public SearchField[] getSearchFields() {
		return searchFields;
	}

	/**
	 * 设置搜索字段
	 * 
	 * @param searchFields
	 *            SearchField数组
	 */
	public void setSearchFields(SearchField[] searchFields) {
		this.searchFields = searchFields;
	}

	/**
	 * 获取搜索字段
	 * 
	 * @return SearchField的List
	 */
	public List<SearchField> getSearchFieldsAsList() {
		return Arrays.asList(searchFields);
	}

	/**
	 * 设置搜索字段
	 * 
	 * @param searchFields
	 *            SearchField的List
	 */
	public void setSearchFields(List<SearchField> searchFields) {
		this.searchFields = searchFields.toArray(new SearchField[0]);
	}

	/**
	 * 获取排序字段
	 * 
	 * @return OrderField 的 List
	 */
	public List<OrderField> getOrderFieldsAsList() {
		return Arrays.asList(orderFields);
	}

	/**
	 * 设置排序字段
	 * 
	 * @param orderFields
	 *            OrderField 的 List
	 */
	public void setOrderFields(List<OrderField> orderFields) {
		this.orderFields = orderFields.toArray(new OrderField[0]);
	}

	/**
	 * 获取排序字段
	 * 
	 * @return OrderField数组
	 */
	public OrderField[] getOrderFields() {
		return orderFields;
	}

	/**
	 * 设置排序字段
	 * 
	 * @param orderFields
	 *            OrderField数组
	 */
	public void setOrderFields(OrderField[] orderFields) {
		this.orderFields = orderFields;
	}

	/**
	 * 获取高亮字段
	 * 
	 * @return HighLightField数组
	 */
	public HighLightField[] getHighLightFields() {
		return highLightFields;
	}

	/**
	 * 设置高亮字段
	 * 
	 * @param highLightFields
	 *            HighLightField数组
	 */
	public void setHighLightFields(HighLightField[] highLightFields) {
		this.highLightFields = highLightFields;
	}

	/**
	 * 获取高亮字段
	 * 
	 * @return HighLightField的List
	 */
	public List<HighLightField> getHighLightFieldsAsList() {
		return Arrays.asList(highLightFields);
	}

	/**
	 * 设置高亮字段
	 * 
	 * @param highLightFields
	 *            HighLightField的List
	 */
	public void setHighLightFields(List<HighLightField> highLightFields) {
		this.highLightFields = highLightFields.toArray(new HighLightField[0]);
	}

}
